package com.young.jpademo2.rsa;

import com.young.jpademo2.utils.IOUtils;
import com.young.jpademo2.utils.RSAUtils;
import java.io.File;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Scanner;

public class RsaTest {
    /** 指定公钥存放文件 */
    private static String PUBLIC_KEY_FILE = "D://key1/PublicKey.txt";
    /** 指定私钥存放文件 */
    private static String PRIVATE_KEY_FILE = "D://key1/PrivateKey.txt";

    public static void createKey() throws Exception {
        // 随机生成一对密钥（包含公钥和私钥）
        KeyPair keyPair = RSAUtils.generateKeyPair();
        // 获取 公钥 和 私钥
        PublicKey pubKey = keyPair.getPublic();
        PrivateKey priKey = keyPair.getPrivate();

        // 保存 公钥 和 私钥
        RSAUtils.saveKeyForEncodedBase64(pubKey, new File(PUBLIC_KEY_FILE));
        RSAUtils.saveKeyForEncodedBase64(priKey, new File(PRIVATE_KEY_FILE));
    }

    public byte[] webEncrypt(String data) throws Exception {
        byte[] cipherData=clientEncrypt(data.getBytes(), new File(PUBLIC_KEY_FILE));
        return cipherData;
    }
    /**
     * 客户端加密, 返回加密后的数据
     */
    private static byte[] clientEncrypt(byte[] plainData, File pubFile) throws Exception {
        // 读取公钥文件, 创建公钥对象
        PublicKey pubKey = RSAUtils.getPublicKey(IOUtils.readFile(pubFile));

        // 用公钥加密数据
        byte[] cipher = RSAUtils.encrypt(plainData, pubKey);
        System.out.println("客户端加密结果："+cipher);
        //System.out.println("客户端加密结果："+ Base64.encodeBase64(cipher));
        return cipher;
    }


    public String serverDecr(byte[] cipherData) throws Exception {
        byte[] plainData = serverDecrypt(cipherData, new File(PRIVATE_KEY_FILE));
        // 输出查看原文
        String str=new String(plainData);
        System.out.println("服务端解密结果："+new String(plainData));
        return str;
    }

    /**
     * 服务端解密, 返回解密后的数据
     */
    private static byte[] serverDecrypt(byte[] cipherData, File priFile) throws Exception {
        // 读取私钥文件, 创建私钥对象
        PrivateKey priKey = RSAUtils.getPrivateKey(IOUtils.readFile(priFile));

        // 用私钥解密数据
        byte[] plainData = RSAUtils.decrypt(cipherData, priKey);

        return plainData;
    }
    public String sys(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("以next方式接收：");
        if(scanner.hasNext()){
            String str=scanner.next();
            System.out.println("输入的数据为："+str);
            scanner.close();
            return str;
        }
        scanner.close();
        return null;
    }
    public RsaTest() {
    }
}
